﻿using System;
using System.Collections.Generic;

using Model;
using Model.Hero;
using Model.Adventure;

namespace RemotingInterfaces
{
    public interface IAccount
    {
    }

    public interface ICharacter : IBase_Stats
    {
        String Name { get; set; }

        double Critical_Hit_Chance { get; }

        int Critical_Hit_Rating { get; }

        int CurrentHealth { get; set; }

        int Level { get; set; }

        String GetRace { get; }

        IDamage Offensive_Damage_Stats { get; }

        IDamage Defensive_Damage_Stats { get; }

        List<IFeat> Feats { get; }

        bool AddFeat(IFeat feat);

        IFeat GetFeat(String name);

        void Increment_Cooldown_Counters();
    }

    public interface INPC
    {
        long XP_Value { get; }
    }

    public interface IHero
    {

    }

    public interface IDamage
    {
        double Base_Damage { get; set; }

        double Slashing { get; set; }
        double Slashing_Damage_Bonus { get; set; }
        double Slashing_Damage { get; }

        double Piercing { get; set; }
        double Piercing_Damage_Bonus { get; set; }
        double Piercing_Damage { get; }

        double Bludgeoning { get; set; }
        double Bludgeoning_Damage_Bonus { get; set; }
        double Bludgeoning_Damage { get; }

        double Fire { get; set; }
        double Fire_Damage_Bonus { get; set; }
        double Fire_Damage { get; }

        double Electrical { get; set; }
        double Elecrical_Damage_Bonus { get; set; }
        double Electrical_Damage { get; }

        double Ice { get; set; }
        double Ice_Damage_Bonus { get; set; }
        double Ice_Damage { get; }

        double Acid { get; set; }
        double Acid_Damage_Bonus { get; set; }
        double Acid_Damage { get; }

        double Sonic { get; set; }
        double Sonic_Damage_Bonus { get; set; }
        double Sonic_Damage { get; }

        double Negative_Energy { get; set; }
        double Negative_Energy_Damage_Bonus { get; set; }
        double Negative_Energy_Damage { get; }

        double Positive_Energy { get; set; }
        double Positive_Energy_Damage_Bonus { get; set; }
        double Positive_Energy_Damage { get; }

        double Divine { get; set; }
        double Divine_Damage_Bonus { get; set; }
        double Divine_Damage { get; }

        double Arcane { get; set; }
        double Arcane_Damage_Bonus { get; set; }
        double Arcane_Damage { get; }

        double Poison { get; set; }
        double Poison_Damage_Bonus { get; set; }
        double Poison_Damage { get; }
    }

    public interface IRace
    {
        String Name { get; set; }
    }

    public interface IBase_Stats
    {
        int Strength { get; set; }
        int Vitality { get; set; }
        int Intellect { get; set; }
        int Perception { get; set; }
        int Agility { get; set; }
        int Luck { get; set; }
        int Attack_Rating { get; }
        int Defense_Rating { get; }
        int Health { get; }
    }

    public interface IFeat
    {
        String Name { get; set; }

        int First_Strike { get; set; }

        int Riposte { get; set; }

        bool Ready { get; set; }

        void Activate();
    }

    public interface ISpell
    {
        String Name { get; set; }
        bool Memorized { get; set; }
        double Intensity { get; set; }
        //int Rank { get; set; }
        int Duration { get; set; }
        int Minimum_Required_Intellect { get; set; }
        IDamage Damage_Stats { get; }
        IBuff Buff { get; }
        IDebuff Debuff { get; }
        int Targets_Affected { get; set; }
        double Spell_Power { get; }
        int Healing_Power { get; set; }
        double Spell_Research_Cost { get; set; }
    }

    public interface IBuff
    {
        String Name { get; set; }
        int Attack_Rating { get; set; }
        int Defense_Rating { get; set; }
        bool Active { get; set; }
    }

    public interface IDebuff
    {
    }

    public interface IDungeon
    {
        String Name { get; }

        //IEncounter getActiveEncounter();
        ICharacter GetRandomMonster();
        void EnterDungeon();
    }

    public interface IEncounter
    {
        ICharacter GetRandomMonster();
    }

    public interface IServerService
    {
        void Connect();
        //login        
        IAccount Login(String user, String pass);
        bool New_Account(String user, String pass);

        //hero stuff
        ICharacter getHero(String name);
        IDungeon getDungeon(String name);        
    }

    public interface IRemoteAdmin
    {
        //contains administration methods
    }
}
